home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Tool Chest / Development Tools & Languages / Dylan Related / Marlais / MacMarlais 0.5.9d46 / AppleEvent stuff / tc-send.el < prev   
Encoding:
Text File  |  1994-11-29  |  14.1 KB  |  426 lines  |  [TEXT/EMAC]

  1. ;;;
  2. ;;; Code to send Apple events to Think C
  3. ;;;
  4.  
  5. (defmacro create-marlais-apple-event (eventClass eventID event transactionID)
  6.   (list 'ae-create-apple-event "Mrls" eventClass eventID event transactionID))
  7.  
  8. (defun marlais:send-event (event)
  9.   (let* ((reply (make-string sizeof-AppleEvent 0))
  10.      (err (AESend event reply (+ kAEQueueReply kAENeverInteract)
  11.               kAENormalPriority 0 0 0)))
  12.     (if (not (zerop err))
  13.     err
  14.       reply)))
  15.  
  16. (defun marlais:open-file (file)
  17.   (let* (event
  18.      (reply (make-string sizeof-AppleEvent 0))
  19.      spec
  20.      transactionID
  21.      (result
  22.       (catch 'panic
  23.         (throw-err (create-marlais-apple-event kCoreEventClass kAEOpenDocuments
  24.                            event transactionID))
  25.         (throw-err (unix-filename-to-FSSpec file spec))
  26.         (throw-err (AEPutParamPtr event keyDirectObject typeFSS spec (length spec)))
  27.         (throw-err (AESend event reply (+ kAENoReply kAENeverInteract)
  28.                    kAENormalPriority 0 0 0))
  29.         noErr)))
  30.     (if event (AEDisposeDesc event))
  31.     result))
  32.  
  33. (defun marlais:extract-result (reply)
  34.   (let* ((result-type (make-string (c:sizeof 'long) 0))
  35.      (result-size (make-string (c:sizeof 'long) 0))
  36.      (err (AESizeOfParam event keyDirectObject result-type result-size)))
  37.     (if (not (zerop err))
  38.     ""
  39.       (let* ((actual-size (extract-internal result-size 0 'long))
  40.          (str (make-string actual-size 0))
  41.          (err (AEGetParamPtr event keyDirectObject typeChar
  42.                  result-type str actual-size result-size)))
  43.     str))))
  44.  
  45. ;; the handler that gets called when the queued reply is received.
  46.  
  47. (defun marlais:do-eval-reply (event history)
  48.   (let* ((error-number-data (make-string 4 0))
  49.      (returnedType (make-string 4 0))
  50.      (actualSize (make-string 4 0))
  51.      (err (AEGetParamPtr event keyErrorNumber typeLongInteger returnedType
  52.                  error-number-data (length error-number-data) actualSize)))
  53.     (if (= err errAEDescNotFound)
  54.     (let* ((result-type (make-string (c:sizeof 'long) 0))
  55.            (result-size (make-string (c:sizeof 'long) 0))
  56.            (err (AESizeOfParam event keyDirectObject result-type result-size)))
  57.       (if (not (zerop err))
  58.           err
  59.         (let* ((actual-size (extract-internal result-size 0 'long))
  60.            (s (make-string actual-size 0))
  61.            (err (AEGetParamPtr event keyDirectObject typeChar
  62.                        result-type s actual-size result-size)))
  63.           (if (not (zerop err))
  64.           err
  65.         (save-excursion
  66.           (insert-reply s)
  67.           noErr))))
  68.       (tc:think-ref-announce-error history error-number-data)
  69.       noErr))))
  70.  
  71. (defun marlais:eval (expr)
  72.   (let* (event
  73.      (reply (make-string sizeof-AppleEvent 0))
  74.      transactionID
  75.      (result
  76.       (catch 'panic
  77.         (throw-err (create-marlais-apple-event kAEMiscStandards kAEDoScript
  78.                            event transactionID))
  79.         (throw-err (AEPutParamPtr event keyDirectObject typeChar expr (length expr)))
  80.         (throw-err (AESend event reply (+ kAEQueueReply kAEAlwaysInteract)
  81.                    kAENormalPriority 0 0 0))
  82.         noErr)))
  83.     ;; store information so our AppleEvent reply can find its way back to us.
  84.     (setq ae-history (cons (cons transactionID
  85.                  (list (cons 'description "marlais:eval")
  86.                        (cons 'handler 'marlais:do-eval-reply)))
  87.                ae-history))
  88.     (if event (AEDisposeDesc event))
  89.     (if reply (AEDisposeDesc reply))
  90.     result))
  91.  
  92. ;; example calls to MacMarlais
  93.  
  94. ;;(marlais:eval "get-file();")
  95. ;;(marlais:eval "1 + 2;")
  96. ;;(marlais:eval "beep();")
  97. ;;(marlais:open-file "~/.emacs")
  98.  
  99. ;;; stuff below is around cause we looked at how THINK-C support works.
  100.  
  101. ;;; Used when sending kRun events
  102. (defvar tc:use-debugger nil)
  103.  
  104. ;;; Used when sending kMake events
  105. (defvar tc:quick-scan t "*When nil, turn off quick scan for Make.")
  106.  
  107. (defmacro create-think-c-apple-event (eventClass eventID event transactionID)
  108.   (list 'ae-create-apple-event "KAHL" eventClass eventID event transactionID))
  109.  
  110. (defun tc:send-event (event)
  111.   (let* ((reply (make-string sizeof-AppleEvent 0))
  112.      (err (AESend event reply (+ kAEQueueReply kAENeverInteract)
  113.               kAENormalPriority 0 0 0)))
  114.     (if (not (zerop err))
  115.     err
  116.       reply)))
  117.  
  118. (defun tc:open-file (file)
  119.   (let* (event
  120.      (reply (make-string sizeof-AppleEvent 0))
  121.      spec
  122.      transactionID
  123.      (result
  124.       (catch 'panic
  125.         (throw-err (create-think-c-apple-event kCoreEventClass kAEOpenDocuments
  126.                            event transactionID))
  127.         (throw-err (unix-filename-to-FSSpec file spec))
  128.         (throw-err (AEPutParamPtr event keyDirectObject typeFSS spec (length spec)))
  129.         (throw-err (AESend event reply (+ kAENoReply kAENeverInteract)
  130.                    kAENormalPriority 0 0 0))
  131.         noErr)))
  132.     (if event (AEDisposeDesc event))
  133.     result))
  134.  
  135. (defun tc:run ()
  136.   (let* (event
  137.      (reply (make-string sizeof-AppleEvent 0))
  138.      transactionID
  139.      (result
  140.       (catch 'panic
  141.         (throw-err (create-think-c-apple-event kAEThinkSuite kAERun
  142.                            event transactionID))
  143.         (throw-err (AEPutParamPtr event keyUpdateOptions typeEnumerated kAEYes 4))
  144.         (throw-err (AEPutParamPtr event keyAESaveOptions typeEnumerated kAEYes 4))
  145.         (throw-err (AEPutParamPtr event keyUseDebugger typeBoolean
  146.                       (make-string 1 (if tc:use-debugger 1 0)) 1))
  147.         (throw-err (AEPutParamPtr event keyGo typeBoolean (make-string 1 1) 1))
  148.         (throw-err (AESend event reply (+ kAEQueueReply kAENeverInteract)
  149.                    kAENormalPriority 0 0 0))
  150.         (setq ae-history (cons (cons transactionID
  151.                      (list (cons 'description "run")
  152.                            (cons 'handler 'do-simple-reply)))
  153.                    ae-history))
  154.         noErr)))
  155.     
  156.     (if event (AEDisposeDesc event))
  157.     result))
  158.  
  159. (defun tc:open-project (file)
  160.   (let* (event
  161.      spec
  162.      (reply (make-string sizeof-AppleEvent 0))
  163.      actualSize
  164.      transactionID
  165.      (result
  166.       (catch 'panic
  167.         (throw-err (create-think-c-apple-event kCoreEventClass kAEOpen
  168.                            event transactionID))
  169.         (throw-err (unix-filename-to-FSSpec file spec))
  170.         (throw-err (AEPutParamPtr event keyDirectObject typeFSS spec (length spec)))
  171.         (throw-err (AESend event reply (+ kAEQueueReply kAENeverInteract)
  172.                    kAENormalPriority 0 0 0))
  173.         (setq ae-history
  174.           (cons (cons transactionID
  175.                   (list (cons 'description (concat "open-project " file))
  176.                     (cons 'handler 'do-simple-reply)))
  177.             ae-history))
  178.         noErr)))
  179.     
  180.     (if event (AEDisposeDesc event))
  181.     result))
  182.  
  183. (defun tc:close-project ()
  184.   (let* ((null-desc (make-string sizeof-AEDesc 0))
  185.      have-null-desc
  186.      (proj-desc (make-string sizeof-AEDesc 0))
  187.      have-proj-desc
  188.      (proj-obj (make-string sizeof-AEDesc 0))
  189.      have-proj-obj
  190.      event
  191.      (reply (make-string sizeof-AppleEvent 0))
  192.      actualSize
  193.      transactionID
  194.      (one (encode-long-integer 1))
  195.      (result
  196.       (catch 'panic
  197.         (throw-err (create-think-c-apple-event kCoreEventClass kAEClose
  198.                            event transactionID))
  199.         (throw-err (AECreateDesc typeNull "" 0 null-desc))
  200.         (setq have-null-desc t)
  201.         (throw-err (AECreateDesc typeLongInteger one (length one) proj-desc))
  202.         (setq have-proj-desc t)
  203.         (throw-err (CreateObjSpecifier cProjectDocument null-desc formAbsolutePosition
  204.                        proj-desc 0 proj-obj))
  205.         (setq have-proj-obj t)
  206.         (throw-err (AEPutParamDesc event keyDirectObject proj-obj))
  207.         
  208.         (throw-err (AESend event reply (+ kAEQueueReply kAENeverInteract)
  209.                    kAENormalPriority 0 0 0))
  210.         
  211.         (setq ae-history
  212.           (cons (cons transactionID (list (cons 'description "close-project")
  213.                           (cons 'handler 'do-simple-reply)))
  214.             ae-history))
  215.         noErr)))
  216.     
  217.     (if have-null-desc (AEDisposeDesc null-desc))
  218.     (if have-proj-desc (AEDisposeDesc proj-desc))
  219.     (if have-proj-obj (AEDisposeDesc proj-obj))
  220.     (if event (AEDisposeDesc event))
  221.     result))
  222.  
  223. (defun tc:build-application (appname)
  224.   (let* ((null-desc (make-string sizeof-AEDesc 0))
  225.      have-null-desc
  226.      (proj-obj (make-string sizeof-AEDesc 0))
  227.      have-proj-obj
  228.      (proj-desc (make-string sizeof-AEDesc 0))
  229.      have-proj-desc
  230.      event
  231.      (reply (make-string sizeof-AppleEvent 0))
  232.      actualSize
  233.      transactionID
  234.      spec
  235.      (one (encode-long-integer 1))
  236.      (result
  237.       (catch 'panic
  238.         (throw-err (create-think-c-apple-event kAECoreSuite kAESave
  239.                            event transactionID))
  240.         
  241.         (throw-err (AECreateDesc typeNull "" 0 null-desc))
  242.         (setq have-null-desc t)
  243.         (throw-err (AECreateDesc typeLongInteger one (length one) proj-desc))
  244.         (setq have-proj-desc t)
  245.         (throw-err (CreateObjSpecifier cProjectDocument null-desc formAbsolutePosition
  246.                        proj-desc 0 proj-obj))
  247.         (setq have-proj-obj t)
  248.         (throw-err (AEPutParamDesc event keyDirectObject proj-obj))
  249.         
  250.         (let ((err (unix-filename-to-FSSpec appname spec)))
  251.           (if (and (not (zerop err)) (not (= err fnfErr))) (throw 'panic err)))
  252.         (throw-err (AEPutParamPtr event keyAEFile typeFSS spec (length spec)))
  253.         (throw-err (AEPutParamPtr event keyAEFileType typeType kProjectType 4))
  254.         (throw-err (AEPutParamPtr event keySaveFlags typeLongInteger one (length one)))
  255.         
  256.         (throw-err (AESend event reply (+ kAEQueueReply kAENeverInteract)
  257.                    kAENormalPriority 0 0 0))
  258.         
  259.         (setq ae-history
  260.           (cons (cons transactionID
  261.                   (list (cons 'description (concat "build-application " appname))
  262.                     (cons 'handler 'tc:do-build-reply)))
  263.             ae-history))
  264.         noErr)))
  265.     
  266.     (if have-null-desc (AEDisposeDesc null-desc))
  267.     (if have-proj-desc (AEDisposeDesc proj-desc))
  268.     (if have-proj-obj (AEDisposeDesc proj-obj))
  269.     (if event (AEDisposeDesc event))
  270.     result))
  271.  
  272. (defun tc:make ()
  273.   (let* ((null-desc (make-string sizeof-AEDesc 0))
  274.      have-null-desc
  275.      (file-desc (make-string sizeof-AEDesc 0))
  276.      have-file-desc
  277.      (file-obj (make-string sizeof-AEDesc 0))
  278.      have-file-obj
  279.      (reply (make-string sizeof-AppleEvent 0))
  280.      event
  281.      resultType
  282.      transactionID
  283.      actualSize
  284.      (flags (encode-long-integer (+ (if tc:quick-scan 2 0) 4)))
  285.      (one (encode-long-integer 1))
  286.      (result
  287.       (catch 'panic
  288.         (throw-err (create-think-c-apple-event kAEThinkSuite kMake
  289.                            event transactionID))
  290.         
  291.         (throw-err (AECreateDesc typeNull "" 0 null-desc))
  292.         (setq have-null-desc t)
  293.         (throw-err (AECreateDesc typeLongInteger one (length one) file-desc))
  294.         (setq have-file-desc t)
  295.         (throw-err (CreateObjSpecifier cProjectDocument null-desc formAbsolutePosition
  296.                        file-desc 0 file-obj))
  297.         (setq have-file-obj t)
  298.         (throw-err (AEPutParamDesc event keyDirectObject file-obj))
  299.         (throw-err (AEPutParamPtr event keyCompileFlags typeLongInteger
  300.                       flags (length flags)))
  301.         
  302.         (throw-err (AESend event reply (+ kAEQueueReply kAENeverInteract)
  303.                    kAENormalPriority 0 0 0))
  304.         
  305.         (setq ae-history (cons (cons transactionID
  306.                      (list (cons 'description "make")
  307.                            (cons 'handler 'tc:do-compile-reply)
  308.                            (cons 'flavor kMake)))
  309.                    ae-history))
  310.         noErr)))
  311.     
  312.     (if have-null-desc (AEDisposeDesc null-desc))
  313.     (if have-file-desc (AEDisposeDesc file-desc))
  314.     (if have-file-obj (AEDisposeDesc file-obj))
  315.     (if event (AEDisposeDesc event))
  316.     result))
  317.  
  318. (defun tc:compile-file-internal (file operation)
  319.   (let* ((null-desc (make-string sizeof-AEDesc 0))
  320.      have-null-desc
  321.      (file-desc (make-string sizeof-AEDesc 0))
  322.      have-file-desc
  323.      (file-obj (make-string sizeof-AEDesc 0))
  324.      have-file-obj
  325.      reply
  326.      event
  327.      resultType
  328.      transactionID
  329.      actualSize
  330.      (flags (encode-long-integer 32))
  331.      (result
  332.       (catch 'panic
  333.         (throw-err (create-think-c-apple-event kAEThinkSuite operation
  334.                            event transactionID))
  335.         
  336.         (throw-err (AECreateDesc typeNull "" 0 null-desc))
  337.         (setq have-null-desc t)
  338.         (throw-err (AECreateDesc typeChar file (length file) file-desc))
  339.         (setq have-file-desc t)
  340.         (throw-err (CreateObjSpecifier cSourceFile null-desc formName
  341.                        file-desc 0 file-obj))
  342.         (setq have-file-obj t)
  343.         (throw-err (AEPutParamDesc event keyDirectObject file-obj))
  344.         
  345.         (if (or (equal operation kDisassemble)
  346.             (equal operation kPreprocess))
  347.         (throw-err
  348.          (AEPutParamPtr event keyCompileFlags typeLongInteger flags (length flags))))
  349.         
  350.         (setq reply (tc:send-event event))
  351.         (if (integerp reply) (throw 'panic reply))            
  352.         (setq ae-history
  353.           (cons (cons transactionID
  354.                   (list
  355.                    (cons 'description
  356.                      (concat
  357.                       (cdr (assoc operation
  358.                           (list (cons kCompile "compile")
  359.                             (cons kCheckSyntax "check-syntax")
  360.                             (cons kPreprocess "preprocess")
  361.                             (cons kDisassemble "disassemble"))))
  362.                       " " file))
  363.                    (cons 'handler 'tc:do-compile-reply)
  364.                    (cons 'flavor operation)))
  365.             ae-history))
  366.         (tc:launch-tpm) ;;; We'll bring TPM to the front here.
  367.         noErr)))
  368.     
  369.     (if have-null-desc (AEDisposeDesc null-desc))
  370.     (if have-file-desc (AEDisposeDesc file-desc))
  371.     (if have-file-obj (AEDisposeDesc file-obj))
  372.     (if event (AEDisposeDesc event))
  373.     result))
  374.  
  375. (defun tc:compile-file (filename)
  376.   (tc:compile-file-internal filename kCompile))
  377.  
  378. (defun tc:check-syntax (filename)
  379.   (tc:compile-file-internal filename kCheckSyntax))
  380.  
  381. (defun tc:disassemble (filename)
  382.   (tc:compile-file-internal filename kDisassemble))
  383.  
  384. (defun tc:preprocess (filename)
  385.   (tc:compile-file-internal filename kPreprocess))
  386.  
  387. (defun tc:remove-objects ()
  388.   (let* (event
  389.      (null-desc (make-string sizeof-AEDesc 0))
  390.      have-null-desc
  391.      (objcode-desc (make-string sizeof-AEDesc 0))
  392.      have-objcode-desc
  393.      (objcode-obj (make-string sizeof-AEDesc 0))
  394.      have-object-obj
  395.      (reply (make-string sizeof-AppleEvent 0))
  396.      actualSize
  397.      transactionID
  398.      (one (encode-long-integer 1))
  399.      (result
  400.       (catch 'panic
  401.         (throw-err (create-think-c-apple-event kAECoreSuite kAEDelete
  402.                            event transactionID))
  403.         (throw-err (AECreateDesc typeNull "" 0 null-desc))
  404.         (setq have-null-desc t)
  405.         (throw-err (AECreateDesc typeLongInteger one (length one) objcode-desc))
  406.         (setq have-objcode-desc t)
  407.         (throw-err (CreateObjSpecifier cObjectCode null-desc formAbsolutePosition
  408.                        objcode-desc 0 objcode-obj))
  409.         (setq have-objcode-obj t)
  410.         (throw-err (AEPutParamDesc event keyDirectObject objcode-obj))
  411.         
  412.         (throw-err (AESend event reply (+ kAEQueueReply kAENeverInteract)
  413.                    kAENormalPriority 0 0 0))
  414.         
  415.         (setq ae-history (cons (cons transactionID
  416.                      (list (cons 'description "remove-objects")
  417.                            (cons 'handler 'do-simple-reply)))
  418.                    ae-history))
  419.         noErr)))
  420.     
  421.     (if event (AEDisposeDesc event))
  422.     (if have-objcode-desc (AEDisposeDesc objcode-desc))
  423.     (if have-objcode-obj (AEDisposeDesc objcode-obj))
  424.     (if have-null-desc (AEDisposeDesc null-desc))
  425.     result))
  426.